﻿using Tibet.GUI.Contrato;
using Tibet.Entidades;
using System.Collections.Generic;
using Tibet.Logica.Comandos;
using Tibet.Logica.FabricaLogica;
using System;

namespace Tibet.GUI.Presentador
{
    /// <summary>
    /// Clase que maneja la lógica de la interfaz de usuario para la creación 
    /// de usuarios
    /// </summary>
    public class PresentadorCreacionUsuario
    {
        private IContratoCreacionUsuario _creacionUsuario;

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="creacionUsuario">
        /// Datos de la página de creación de usuario requeridos para crear un
        /// nuevo usuario
        /// </param>
        public PresentadorCreacionUsuario
            (IContratoCreacionUsuario creacionUsuario)
        {
            _creacionUsuario = creacionUsuario;
        }

        /// <summary>
        /// Código a ejecutar cuando el usuario presiona el botón Crear
        /// para crear un nuevo usuario
        /// </summary>
        /// <returns>Si la operación fue exitosa o no</returns>
        public string ClickCrear()
        {
            Rol rol = new Rol();

            Credencial credencial = new Credencial
                (_creacionUsuario.NombreUsuario, _creacionUsuario.Contrasenha,
                1);
            Usuario usuario = new Usuario(_creacionUsuario.Nombre, "",
                _creacionUsuario.Apellido, "", _creacionUsuario.Email, 1,
                credencial, rol);

            Comando comando = FabricaComandoUsuario.
                CrearComandoValidarUsuario(usuario);
            comando.Ejecutar();
            if (comando.Flag)
                return "El usuario ya se encuentra registrado en la base de " +
                    "datos!";

            comando = FabricaComandoUsuario.
                CrearComandoCrearUsuario(usuario);
            comando.Ejecutar();
            if (!comando.Flag)
                return "No se ha podido crear el usuario!";

            comando = FabricaComandoCredencial.
                CrearComandoCrearCredencial(credencial);
            comando.Ejecutar();
            if (!comando.Flag)
            {
                comando = FabricaComandoUsuario.
                    CrearComandoEliminarUsuario(usuario);
                comando.Ejecutar();
                if (!(comando.Flag))
                    return "La creación de la credencial falló y no se ha\n" +
                        "podido eliminar el usuario tras el fallo!";

                return "No se ha podido crear la credencial!\nLa operación " +
                    "de creación de usuario se deshizo!";
            }

            return "El usuario fue creado con éxito!";
        }
    }
}

